# ============================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name: CMakeLists.txt
# * Author   : 苏木
# * Date     : 2025-05-22
# * Version  : 
# * Description: cmake version 3.16.3
# ============================================================
## https://cmake.com.cn/cmake/help/latest/guide/tutorial/index.html
## https://cmake.org/cmake/help/latest/

# 指定 CMake 的最低版本要求
# --------------------------------------------------
cmake_minimum_required(VERSION 3.10)


# 设置项目名称和使用的编程语言
# --------------------------------------------------
project(SPROJECT C)


# 指定可执行程序和源文件
# --------------------------------------------------
add_executable(app_demo.out main.c)

# 命令重载
# --------------------------------------------------
# 当function()或macro()用来定义新命令时，如果命令名称已经存在，那么没有文档记录的CMake行为就是使用
# 相同的名称来使用旧命令，除了前面有一个下划线。无论旧名称用于内建命令还是自定义函数或宏，这都适用。

# 重定义一个message
message(STATUS "==> ${CMAKE_VERSION} 命令重载demo")
# 使用宏(macro)保存原始message命令
macro(original_message)  # 创建备份容器
    # 这里的${ARGN}会直接展开参数
    _message(${ARGN})    # 调用下划线开头的原始命令
endmacro()

function(message)  # 定义同名函数覆盖原始命令
    # 添加自定义前缀
	string(TIMESTAMP current_time "%Y-%m-%d %H:%M:%S")
	# 获取调用位置信息
    # set(caller_file ${CMAKE_CURRENT_LIST_FILE})
	get_filename_component(caller_file ${CMAKE_CURRENT_LIST_FILE} NAME)
    set(caller_line ${CMAKE_CURRENT_LIST_LINE}) # 这一行的行号

    set(p "[${current_time}][${caller_file}:${caller_line}]")
    # 处理不同类型消息
    if("${ARGV0}" STREQUAL "STATUS" OR 
       "${ARGV0}" STREQUAL "WARNING" OR
       "${ARGV0}" STREQUAL "FATAL_ERROR")
        original_message(${ARGV0} "${p} ${ARGV1}")
    else()
        original_message("${p} ${ARGN}")
    endif()
endfunction()
message(STATUS "status message")
message("\n")
# 输出如下：
# -- ==> 3.16.3 命令重载demo
# -- [2025-05-24 13:26:55][CMakeLists.txt:45] status message
# [2025-05-24 13:26:55][CMakeLists.txt:45] 

